package mine.code.question.动态规划;

import org.junit.Test;

/**
 * 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ，计算其二进制数中的 1 的数目并将它们作为数组返回。
 * <p>
 * 输入: 2
 * 输出: [0,1,1]
 *
 * @author caijinnan
 * @date 2020/3/18 13:39
 */
public class 比特位计数 {
    @Test
    public void run() {
        int num = 56;
        int[] nums = countBits(num);
        System.out.println(nums[56]);
    }

    //n & (n-1)==0 判断是否是2的整数幂次数
    // 奇数的个数即前一个数字的个数+1,
    // 偶数就是 等于除以二的数的值
    public int[] countBits(int num) {
        int[] bitNumArr = new int[num + 1];
        bitNumArr[0] = 0;
        for (int i = 1; i <= num; i++) {
            if ((i & (i - 1)) == 0) {
                bitNumArr[i] = 1;
            } else if (i % 2 == 1) {
                bitNumArr[i] = bitNumArr[i - 1] + 1;
            } else {
                bitNumArr[i] = bitNumArr[i >> 1];
            }
        }
        return bitNumArr;
    }
}